<!DOCTYPE html>
<html>

<head>
    <meta charset="utf-8" />
    <script>


        // class A0 {
        //     getA0name() { return "szq0" }
        // }
        // class A extends A0 {
        //     getAname() { return "szqA" }
        // }

        //  let a=new A();
        // // console.log(Reflect.getPrototypeOf(a));
        // // console.log(a.__proto__)

        // // Object.getPrototypeOf()获取子类的父类或者实例的原型
        // // Object.getPrototypeOf()获取子类的父类
        // console.log(A.__proto__)
        // console.log(Reflect.getPrototypeOf(A) ===A.__proto__);//A0类

        // // Object.getPrototypeOf()实例的原型
        // console.log(a.__proto__)
        // console.log(A.prototype)
        // console.log(Reflect.getPrototypeOf(a)===a.__proto__);

        class A0 {
            getA0name() { return "szq0" }
        }
        class A extends A0 {
            getAname() { return "szqA" }
        }

        console.log(A.__proto__ === A0) // 指向父类A0 ，表示class的继承关系 (子类父类继承关系 静态方法直接继承)
        console.log(A.prototype) // A.prototype是指A的构造器 以及公共函数 属性 (类自己的原型)
        console.log(A.prototype.__proto__ === A0.prototype) // ===指向父类A0.prototype===是指A0的构造器 以及公共函数(父类的原型)


        // 1）子类的__proto__属性，表示构造函数的继承，总是指向父类。
        // 2）子类prototype属性的__proto__属性，表示方法的继承，
        //    总是指向父类的prototype属性
        // 3) 子类实例的__proto__ 属性 等于 子类prototype属性
        // 4) 子类实例的__proto__.__proto__  属性 等于 子类prototype.__proto__属性 等于 父类的 prototype属性


        // class A {
        //     static funAStatic() {
        //         return "funAStatic";
        //     }
        //     funA() {
        //         return "funA";
        //     }
        //     #prop1 = "#prop1"

        //     get [Symbol.for("prop1")]() {
        //         return this.#prop1;
        //     };
        //     set [Symbol.for("prop1")](value) {
        //         this.#prop1 = value
        //     }

        //     mprop1 = "mprop1"
        //     get prop1() {
        //         return this.mprop1;
        //     };
        //     set prop1(value) {
        //         this.mprop1 = value
        //     }

        // };
        // class B extends A{
        //     static funBStatic() {
        //         return "funBStatic";
        //     }
        //     funB() {
        //         return "funB";
        //     }
        // };


        ////////////////////////////////////////
        // 如果不用extends关键字，如何完成继承关系？ 如下所示
        ////////////////////////////////////////
        // // Reflect.setPrototypeOf(B, A);
        // // Reflect.setPrototypeOf(B.prototype, A.prototype);
        // console.log(B);

        // console.log(B.funAStatic());
        // console.log(B.funBStatic());
        // let newB = new B();
        // console.log(A.prototype);
        // console.log(A.prototype.__proto__);
        // // console.log(newB.funA());
        // // console.log(newB.funB());
        // // console.log(newB[Symbol.for("prop1")]);
        // // console.log(newB["prop1"]);

        // ////////////////////////////////////////
        // //B 继承 A 的静态属性
        // ////////////////////////////////////////
        // // Reflect.setPrototypeOf(B,A);
        // // console.log(B);
        // // // console.log(B.funA()); //报错
        // // console.log(B.funAStatic()); //

        // ////////////////////////////////////////
        // //B 继承 A 的实例属性（B 的实例继承 A 的实例）
        // ////////////////////////////////////////
        // Reflect.setPrototypeOf(B.prototype, A.prototype);
        // console.log(B);
        // console.log((new B).funA()); //
        // // console.log(B.funAStatic()); //报错






    </script>
</head>

<body>

</body>

</html>